package com.qingcheng.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.qingcheng.pojo.goods.Goods;
import com.qingcheng.pojo.goods.Sku;
import com.qingcheng.pojo.goods.Spu;
import com.qingcheng.service.goods.CategoryService;
import com.qingcheng.service.goods.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/item")
public class ItemController {

    @Reference
    private SpuService spuService;

    //注解方式读取配置文件，指定thyemleaf页面生成位置
    @Value("${pagePath}")
    private String pagePath;

    @Reference
    private CategoryService categoryService;

    @Autowired
    private TemplateEngine templateEngine;

    @GetMapping("/createPage")
    public void createPage(String spuId){

        //根据spuid查询商品列表
        Goods good = spuService.findGoodsById(spuId);
        //获取spu
        Spu spu = good.getSpu();
        //获取sku列表
        List<Sku> skuList = good.getSkuList();

        //6.显示导航栏  根据id查询商品分类
        ArrayList<String> categoryList = new ArrayList<>();
        categoryList.add(categoryService.findById(spu.getCategory1Id()).getName());
        categoryList.add(categoryService.findById(spu.getCategory2Id()).getName());
        categoryList.add(categoryService.findById(spu.getCategory3Id()).getName());


        //生成SKU地址列表
        Map urlMap=new HashMap();
        for(Sku sku:skuList){
            //对规格json字符串进行排序    
            if("1".equals(sku.getStatus())){
                String specJson=JSON.toJSONString(JSON.parseObject(sku.getSpec()), SerializerFeature.MapSortField);
                urlMap.put(specJson,sku.getId()+".html");
            }
        }


        //循环遍历生成sku页面
        for (Sku sku : skuList) {
            //1.创建上下文对象和数据模型
            Context context = new Context();
            //2.创建map集合，存入数据
            HashMap<String, Object> dataModel = new HashMap<>();
            dataModel.put("spu",spu);
            dataModel.put("sku",sku);
            dataModel.put("categoryList",categoryList);
             //查询图片列表
            dataModel.put("skuImages",sku.getImages().split(","));//sku图片列表
            dataModel.put("spuImages",spu.getImages().split(","));//spu图片列表

            //8.查询商品的参数和规格
            Map paraItems = JSON.parseObject(spu.getParaItems());//参数列表
            dataModel.put("paraItems",paraItems);

            Map<String,String> specItems = (Map)JSON.parseObject(sku.getSpec());//规格列表
            dataModel.put("specItems",specItems);


            //9.查询规格面板，规格选项
            //{"颜色":["金色","黑色","蓝色"],"版本":["6GB+64GB"]}
            Map<String,List> specMap =  (Map)JSON.parseObject(spu.getSpecItems());//规格和规格选项
            //循环遍历规格列表   颜色  版本
            for (String key : specMap.keySet()) {
                List<String> list = specMap.get(key);//["金色","黑色","蓝色"]

                // [{ 'option':'天空之境',checked:true },{ 'option':'珠光贝母',checked:false }]
                ArrayList<Map> mapList = new ArrayList<>();//创建新的集合
                //循环规格选项
                for (String value : list) {//循环遍历得到的value也就是["金色","黑色","蓝色"]
                    Map map = new HashMap<>();
                    map.put("option",value);//规格选项
                    if (specItems.get(key).equals(value)) {//如果和当前的规格相同，就代表选中
                        map.put("checked",true);
                    }else {
                        map.put("checked",false);
                    }
                    Map<String,String> spec=(Map)JSON.parseObject(sku.getSpec());
                    spec.put(key,value);
                    String specJson = JSON.toJSONString(spec , SerializerFeature.MapSortField);//对字符串进行排序
                    map.put("url",urlMap.get(specJson));
                    mapList.add(map);
                }
                specMap.put(key,mapList);//新的集合替换掉原来的集合
            }
            dataModel.put("specMap",specMap);

            //3.将数据封装进数据模型
            context.setVariables(dataModel);
            //4.创建文件对象
            File file = new File(pagePath);
            //判断文件是否存在
            if(!file.exists()){
                file.mkdirs();
            }
            //创建文件对象
            File dest = new File(file,sku.getId()+".html");


            try {
                //创建文件输出流
                PrintWriter writer=new PrintWriter( dest,"UTF-8");
                //5.生成页面
                templateEngine.process("item",context,writer);

                System.out.println("生成页面："+sku.getId()+".html");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }


        }


    }









    /*@GetMapping("/createPage")
    public void createPage(String spuId){

        //1.查询商品信息
        Goods goods = spuService.findGoodsById(spuId);
        // 获取spu信息
        Spu spu = goods.getSpu();
        // 获取sku列表
        List<Sku> skuList = goods.getSkuList();


        //查询商品分类
        List<String> categoryList=new ArrayList<>();
        categoryList.add(  categoryService.findById(spu.getCategory1Id()).getName() );//一级分类
        categoryList.add(  categoryService.findById(spu.getCategory2Id()).getName() );//二级分类
        categoryList.add(  categoryService.findById(spu.getCategory3Id()).getName() );//三级分类

        //sku地址列表
        Map<String,String> urlMap=new HashMap<>();
        for(Sku sku:skuList){
            if("1".equals(sku.getStatus())){
                String specJson = JSON.toJSONString( JSON.parseObject(sku.getSpec()), SerializerFeature.MapSortField);
                urlMap.put(specJson,sku.getId()+".html");
            }
        }

        //2.批量生成sku页面

        for(Sku sku:skuList){
            //(1) 创建上下文和数据模型
            Context context=new Context();
            Map<String,Object> dataModel= new HashMap<>();
            dataModel.put("spu",spu);
            dataModel.put("sku",sku);
            dataModel.put("categoryList",categoryList);
            dataModel.put("skuImages", sku.getImages().split(",") );//sku图片列表
            dataModel.put("spuImages", spu.getImages().split(",") );//spu图片列表

            Map paraItems=   JSON.parseObject( spu.getParaItems());//参数列表
            dataModel.put("paraItems",paraItems);
            Map<String,String> specItems = (Map)JSON.parseObject(sku.getSpec());//规格列表  当前sku
            dataModel.put("specItems",specItems);

            //{"颜色":["天空之境","珠光贝母"],"内存":["8GB+64GB","8GB+128GB","8GB+256GB"]}
            //{"颜色":[{ 'option':'天空之境',checked:true },{ 'option':'珠光贝母',checked:false }],.....}
            Map<String,List> specMap =  (Map)JSON.parseObject(spu.getSpecItems());//规格和规格选项
            for(String key :specMap.keySet()  ){  //循环规格
                List<String> list = specMap.get(key);//["天空之境","珠光贝母"]
                List<Map> mapList=new ArrayList<>();//新的集合  //[{ 'option':'天空之境',checked:true },{ 'option':'珠光贝母',checked:false }]
                //循环规格选项
                for(String value:list){
                    Map map=new HashMap();
                    map.put("option",value);//规格选项
                    if(specItems.get(key).equals(value) ){  // 如果和当前sku的规格相同，就是选中
                        map.put("checked",true);//是否选中
                    }else{
                        map.put("checked",false);//是否选中
                    }
                    Map<String,String>  spec= (Map)JSON.parseObject(sku.getSpec()) ;//当前的Sku
                    spec.put(key,value);
                    String specJson = JSON.toJSONString(spec , SerializerFeature.MapSortField);
                    map.put("url",urlMap.get(specJson));
                    mapList.add(map);
                }
                specMap.put(key,mapList);//用新的集合替换原有的集合
            }

            dataModel.put("specMap" ,specMap);

            context.setVariables(dataModel);

            //（2）准备文件
            File dir =new File(pagePath);
            if( !dir.exists()){
                dir.mkdirs();
            }
            File dest= new File(dir, sku.getId()+".html" );

            //（3）生成页面
            try {
                PrintWriter writer=new PrintWriter( dest,"UTF-8");
                templateEngine.process("item",context,writer );
                System.out.println("生成页面："+sku.getId()+".html");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }


    }*/



}
